package business;

import java.util.ArrayList;

import persistence.db.DataSet;
import persistence.model.AbstractModel;
import persistence.model.Matiere;
import persistence.model.Semestre;
import persistence.model.UE;
import utility.Record;

public class UEBL {

	private UE ue = null;
	ArrayList<String> listeErreurs = null;
	
	public UEBL() {
	}
	
	public UEBL(int id){
		ue = (UE) UE.all().get(id);
	}
		
	
	/**
	 * @return si la demande d'ajout ou de modification est valide ou non
	 */
	public boolean estValidePourModif(){
		
		boolean identique = false;
		// Verification ajout d une UE deja existante - note min - nb ects
/*		for (AbstractModel ueModel : UE.all()) {
			UE UECourant = (UE)ueModel;
			if (UECourant.getNomUE().equals( ue.getNomUE()))
				identique = true;
		}
		if (identique == true) {
			listeErreurs.add("Cette UE existe deja");
		}
*/		if (ue.getNoteMinUE() < 0 || ue.getNoteMinUE() > 20 ) {
			listeErreurs.add("La note minimale doit etre comprise entre 0 et 20");
			}
		if (ue.getNbECTS() < 0 || ue.getNbECTS() > 30) {
			listeErreurs.add("Le nombre d'ECTS doit etre compris entre 0 et 30");
		}
		int sommeUE = 0;
		// Recuperation de la somme du nb ECTS de toutes les UE
/*		for (AbstractModel ue : UE.all())
		{
			UE UECourant = (UE)ue;
			sommeUE += UECourant.getNbECTS();
		}
		if (sommeUE > 30) {
			listeErreurs.add("La somme des ECTS des UE du semestre ne doit pas depasser 30");
		}
*/		
		// S'il y a des erreurs, demande d'ajout non valide, sinon est valide
		if (listeErreurs.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}
	

	/**
	 * @return si la demande de suppression est valide ou non
	 */
	public boolean estValidePourSuppr(){
		// S'il existe des matieres dans l'UE a supprime, est pas valide

		ArrayList<Record> listeMatieres = getListeMatiere();
		if (!listeMatieres.isEmpty()) {
			listeErreurs.add("Matieres existantes dans l'UE");
			return false;
		} else {
			return true;
		}
	}
		

	/**
	 * @param id : identifiant de l'UE
	 * @param nom : nom de l'UE
	 * @param desc : description de l'UE
	 * @param nbECTS : nombre d'ECTS de l'UE
	 * @param noteMin : note minimum pour valider l'UE
	 * @return la liste des erreurs
	 */
	public ArrayList<String> ajouterUE(int id, String nom, String desc, int nbECTS, int noteMin, int idSemestre, DataSet matiereSet)
	{
		listeErreurs = new ArrayList<String>();
//		if (estValidePourModif()) {
			ue = new UE(id, nom, desc, nbECTS, noteMin, idSemestre, matiereSet);
			ue.save();
//		}
		return listeErreurs;
	}

	/**
	 * @param id : identifiant de l'UE
	 * @param nom : nom de l'UE
	 * @param desc : description de l'UE
	 * @param nbECTS : nombre d'ECTS de l'UE
	 * @param noteMin : note minimum pour valider l'UE
	 * @param idSemestre : identifiant du semestre associe
	 * @param matiereSet : l'ensemble des matieres
	 * @return la liste des erreurs
	 */
	public ArrayList<String> modifierUE(int id, String nom, String desc, int nbECTS,
			int noteMin, int idSemestre, DataSet matiereSet) {
		
		listeErreurs = new ArrayList<String>();
		if (estValidePourModif()) {
			ue = new UE(id, nom, desc, nbECTS, noteMin, idSemestre, matiereSet);
			ue.save(id);
		}
		return listeErreurs;
	}

	/**
	 * @return la liste des erreurs
	 */
	public ArrayList<String> supprimerUE() {
		
		listeErreurs = new ArrayList<String>();
		if (estValidePourSuppr()) {
			ue = new UE(ue.getId());
			ue.delete();
		}
		return listeErreurs;
	}
	

	/* Ensemble des getters et setters -> delegation vers la persistance */

	public void setIdUE(int idUE) {
		ue.setId(idUE);
	}

	public String getNomUE() {
		return ue.getNomUE();
	}

	public void setNomUE(String nomUE) {
		ue.setNomUE(nomUE);
	}

	public String getDescriptionUE() {
		return ue.getDescriptionUE();
	}

	public void setDescriptionUE(String descriptionUE) {
		ue.setDescriptionUE(descriptionUE);
	}

	public int getNbECTS() {
		return ue.getNbECTS();
	}

	public void setNbECTS(int nbECTS) {
		ue.setNbECTS(nbECTS);
	}

	public int getNoteMinUE() {
		return ue.getNoteMinUE();
	}

	public void setNoteMinUE(int noteMinUE) {
		ue.setNoteMinUE(noteMinUE);
	}
	
	
	/**
	 * @return la liste des matieres de cette UE
	 */
	public ArrayList<Record> getListeMatiere() {
		ArrayList<Record> listeMatiere = new ArrayList<Record>();

		for (AbstractModel matiere : ue.getMatiereSet()) {
			Matiere matiereCourant = (Matiere) matiere;

			int idMatiere = matiereCourant.getId();
			String nomMatiere = matiereCourant.getNomMatiere();
			listeMatiere.add(new Record(idMatiere, nomMatiere));
		}
		return listeMatiere;
	}
}
